﻿/**************************************************************
* 功   能 ：程序主入口
* 创 建 人：ColaShou
* 创建时间：2023-08-04
* 最近修改人：
* 修改  时间：
* 修改  内容:
* ***************************************************************/
namespace ColaWinFormFrameWork
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text.RegularExpressions;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using ColaWinFormFrameWork.UICommon.Dto;

    /// <summary>
    /// 程序主入口.
    /// </summary>
    internal static class Program
    {
        /// <summary>
        /// 指令编码.
        /// </summary>
        private const int LGinforMsg = 0x400;

        /// <summary>
        /// 用来处理只允许单个应用程序运行.
        /// </summary>
        private static Mutex mutex = new Mutex(true, "AppName");

        /// <summary>
        /// 发送消息到指定窗口.
        /// </summary>
        /// <param name="hWnd">其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST，则消息将被发送到系统中所有顶层窗口，
        /// 包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口，但消息不被发送到子窗口.</param>
        /// <param name="msg">指定被发送的消息.</param>
        /// <param name="wParam">指定附加的消息指定信息1.</param>
        /// <param name="lParam">指定附加的消息指定信息2.</param>
        /// <returns>IntPtr.</returns>
        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam); // 窗口句柄.

        /// <summary>
        /// 获取窗体句柄.
        /// </summary>
        /// <param name="lpClassName">指向一个指定了类名的空结束字符串，或一个标识类名字符串的成员的指针。假设该參数为一个成员，
        /// 则它必须为前次调用theGlobafAddAtom函数产生的全局成员。该成员为16位，必须位于IpClassName的低 16位，高位必须为 0.</param>
        /// <param name="lpWindowName">指向一个指定了窗体名（窗体标题）的空结束字符串。假设该參数为空，则为全部窗体全匹配.</param>
        /// <returns>int.</returns>
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 应用程序的主入口点.
        /// </summary>
        [STAThread]
        private static void Main(string[] webParams)
        {
            string webParam = string.Empty; // 浏览器传过来的参数
            if (webParams != null && webParams.Count() > 0)
            {
                webParam = Regex.Match(webParams[0], @"(?<=://).+?(?=:|/|\Z)").Value;
            }

            MessageBox.Show(webParam);

            // 没有开启，可以正常启动
            if (mutex.WaitOne(TimeSpan.Zero, true))
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new FormUnit(webParam));
            }
            else
            {
                // 把指令消息传递给已经运行的程序进程
                MessageBox.Show("应用程序已经在运行中!");

                // 获取目标窗口的句柄
                int targetHandle = FindWindow(null, "FormUnit");
                if (targetHandle != 0)
                {
                    CopyDataStruct cdata;

                    byte[] arr = System.Text.Encoding.Default.GetBytes("指令消息");
                    int len = arr.Length;

                    cdata.DwData = (IntPtr)100;
                    cdata.LpData = "指令消息";
                    cdata.CData = len + 1;

                    IntPtr intPtr = (IntPtr)11;

                    try
                    {
                        int intParam = Convert.ToInt32(webParam);

                        // 发送自定义消息
                        long result = SendMessage(targetHandle, LGinforMsg, new IntPtr(1), new IntPtr(intParam)).ToInt64();
                        MessageBox.Show("找到窗体,发送的消息是:" + intParam);
                        Application.Exit(); // 退出程序
                    }
                    catch
                    {
                        MessageBox.Show("浏览器传入的指令无效");
                        Application.Exit(); // 退出程序
                    }
                }
                else
                {
                    MessageBox.Show("无法找到目标窗口【FormUnit】");
                    Application.Exit(); // 退出程序
                }
            }
        }
    }
}
